package com.goa.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;

public class DateUtil {
    public static String YYYY = "yyyy";

    public static String YYYY_MM = "yyyy-MM";

    public static String YYYY_MM_DD = "yyyy-MM-dd";

    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    private static String[] parsePatterns = {
            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};

    /**
     * 获取当前日期前一天的0点和24点时间戳
     * @return long[] 包含前一天0点和24点的时间戳
     */
    public static long[] getTimestampsForPreviousDay() {
        // 获取当前日期
        LocalDate today = LocalDate.now();

        // 获取前一天
        LocalDate previousDay = today.minusDays(1);

        // 获取前一天0点的时间戳
        long startOfPreviousDay = previousDay.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();

        // 获取前一天24点的时间戳（即当前天的0点）
        long endOfPreviousDay = today.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();

        return new long[]{startOfPreviousDay, endOfPreviousDay};
    }

    /**
     * 指定格式转换开为当天时间的始时间戳和结束时间戳
     * 格式：yyyy-MM-dd
     */
    public static long[] getTimestamps(String dateString) {
        // 解析日期字符串为 LocalDate
        LocalDate date = LocalDate.parse(dateString);

        // 获取当天0点的时间戳
        long startOfDay = date.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();

        // 获取当天24点的时间戳（即次日的0点）
        long endOfDay = date.plusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();

        return new long[]{startOfDay, endOfDay};
    }

    /**
     * 获取前一天的日期，格式为 yyyy-MM-dd
     *
     * @return 前一天的日期字符串
     */
    public static String getYesterdayDate() {
        // 创建日历对象
        Calendar calendar = Calendar.getInstance();
        // 将日历时间设置为当前时间
        calendar.setTime(new Date());
        // 将日期设置为前一天
        calendar.add(Calendar.DATE, -1);

        // 格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD);
        return sdf.format(calendar.getTime());
    }


    /**
     * 判断时间戳距离当天的0点或24点的差是否大于指定的秒数
     *
     * @param type 0判断距离0点  1判断距离24点
     * @param timestamp 要判断的时间戳（毫秒）
     * @param seconds   指定的秒数
     * @return true：距离大于指定秒数，false：距离不大于指定秒数
     */
    public static boolean isDistanceGreaterThanSeconds(Integer type,long timestamp, int seconds) {
        // 创建日期对象
        Date date = new Date(timestamp);

        // 获取日历对象
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);

        // 获取当前日期的0点时间
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        if (type==0){
            long midnight = calendar.getTimeInMillis();
            // 计算距离0点的差值（秒）
            long distanceFromMidnight = (timestamp - midnight) / 1000;
            return Math.abs(distanceFromMidnight) > seconds;
        }else {
            // 获取当前日期的24点时间
            calendar.set(Calendar.HOUR_OF_DAY, 24);
            long endOfDay = calendar.getTimeInMillis();
            // 计算距离24点的差值（秒）
            long distanceFromEndOfDay = (endOfDay - timestamp) / 1000;
            return Math.abs(distanceFromEndOfDay) > seconds;
        }
    }
    /**
     * 获取当前Date型日期
     *
     * @return Date() 当前日期
     */
    public static Date getNowDate()
    {
        return new Date();
    }

    /**
     * 获取当前日期, 默认格式为yyyy-MM-dd
     *
     * @return String
     */
    public static String getDate()
    {
        return dateTimeNow(YYYY_MM_DD);
    }

    public static final String getTime()
    {
        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
    }

    public static final String dateTimeNow()
    {
        return dateTimeNow(YYYYMMDDHHMMSS);
    }

    public static final String dateTimeNow(final String format)
    {
        return parseDateToStr(format, new Date());
    }

    public static final String dateTime(final Date date)
    {
        return parseDateToStr(YYYY_MM_DD, date);
    }

    public static final String parseDateToStr(final String format, final Date date)
    {
        return new SimpleDateFormat(format).format(date);
    }

    public static final Date dateTime(final String format, final String ts)
    {
        try
        {
            return new SimpleDateFormat(format).parse(ts);
        }
        catch (ParseException e)
        {
            throw new RuntimeException(e);
        }
    }
}
